package com.choosefine.base.shixiaobao.common.utils;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileFilter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Collections;

/**
 * <p>
 * IO工具类
 * </p>
 * <p>
 * IO工具
 * </p>
 *
 * @author Ye_WD 2012-10-16
 * @version 1.0
 */
public class IOUtil {

    private IOUtil() {
    }

    /**
     * 根据自定义过滤器查找文件
     *
     * @param dir    根目录
     * @param filter 自定义的过滤器
     * @return
     */
    public static File[] findByFilter(File dir, FileFilter filter) {
        File[] files = dir.listFiles();
        if (files == null || files.length == 0) {
            return new File[0]; //
        }
        ArrayList<File> list = new ArrayList<File>();
        for (File f : files) {
            if (f.isFile()) {
                if (filter.accept(f)) { //
                    list.add(f);
                }
            } else {
                File[] arr = findByFilter(f, filter);
                Collections.addAll(list, arr);
            }
        }
        return list.toArray(new File[0]);
    }

    /**
     * 根据正则表达式查找文件
     *
     * @param dir
     * @param pattern
     * @return
     */
    public static File[] findByRegex(File dir, String pattern) {
        File[] files = dir.listFiles();
        if (files == null || files.length == 0) {
            return new File[0]; // ���ؿ������ʾû���ļ�
        }
        ArrayList<File> list = new ArrayList<File>();
        for (File f : files) {
            if (f.isFile()) {
                if (f.getName().matches(pattern)) {
                    list.add(f); // ƥ����ļ����뼯��
                }
            } else {
                // �ݹ���Ŀ¼f����,����Ŀ¼�ҵ��������ļ����뼯��
                File[] arr = findByRegex(f, pattern);
                Collections.addAll(list, arr);
            }
        }
        return list.toArray(new File[0]);
    }

    /**
     * 删除一个根目录节点
     *
     * @param dir
     * @return
     */
    public static boolean dirDelete(File dir) {
        File[] files = dir.listFiles();
        if (files == null || files.length == 0) {
            return dir.delete(); // ��Ŀ¼ֱ��ɾ
        }
        for (File f : files) {
            if (f.isFile()) {
                if (!f.delete()) { // ĳ���ļ�ɾ����
                    return false;
                }
            } else {
                // �ݹ�ɾ��Ŀ¼f
                if (!dirDelete(f)) { // ĳ��Ŀ¼ɾ����
                    return false;
                }
            }
        }
        // dir����������ɾ���ɾ��dir
        return dir.delete();
    }

    public static long dirLength(File dir) {
        File[] files = dir.listFiles();
        if (files == null || files.length == 0) {
            return 0;
        }
        long size = 0;
        for (File f : files) {
            if (f.isFile()) {
                size += f.length();
            } else {
                // ��Ŀ¼f�Ĵ�С
                size += dirLength(f); // �ݹ�
            }
        }
        return size;
    }

//    public static void main(String[] args) {
//        // long size =
//        // IOUtil.dirLength(new File("D:/spring"));
//        // System.out.println(size);
//
//        // boolean b =
//        // IOUtil.dirDelete(new File("D:/ce"));
//        // System.out.println(b);
//
//        // File[] arr = IOUtil.findByRegex(
//        // new File("c:/windows"),
//        // ".*\\.[bB][mM][pP]$"); // .*\.[bB][mM][pP]$ // Bmp BMP bMp
//        // for (File f : arr) {
//        // System.out.println(f.getName());
//        // }
//
//        /**
//         *
//         class SizeFilter implements FileFilter { public boolean accept(File
//         * f) { if (f.length() >= 1024 * 1024) { return true; } else { return
//         * false; } } } File[] arr = IOUtil.findByFilter(new File("c:/windows"),
//         * new SizeFilter()); for (File f : arr) {
//         * System.out.println(f.getName() + " - " + f.length()); }
//         */
//        System.out.println(getSrcPath());
//    }

    /**
     * 复制文件夹及其中的文件
     *
     * @param source 源文件夹
     * @param target 目标文件夹
     * @throws IOException
     */
    public static void copyFolder(File source, File target) throws IOException {
        if (source.isDirectory()) {
            if (!target.exists()) {
                target.mkdir();
            }
            String files[] = source.list();
            for (String file : files) {
                File srcFile = new File(source, file);
                File destFile = new File(target, file);
                // 递归复制
                copyFolder(srcFile, destFile);
            }
        } else {
            copyFile(source, target);
        }
    }

    /**
     * 复制文件
     *
     * @param source
     * @param target
     * @throws IOException
     */
    public static void copyFile(File source, File target) throws IOException {
        if (!target.exists()) target.createNewFile();
        InputStream in = new FileInputStream(source);
        OutputStream out = new FileOutputStream(target);

        byte[] buffer = new byte[1024];

        int length;

        while ((length = in.read(buffer)) > 0) {
            out.write(buffer, 0, length);
        }
        in.close();
        out.close();
    }

    /**
     * 获取当前项目文件夹
     */
    public static String getSrcPath() {
        String src = System.getProperty("user.dir");
        src += "/src";
        return src;
    }

    /**
     * 获取当前类文件夹
     */
    public static String getThisClassPath(String className) {
        String src = getSrcPath();
        String classPath = className.substring(0, className.lastIndexOf('.'));
        classPath = classPath.replace('.', '/');
        String path = src + "/" + classPath;
        return path;
    }

    /**
     * 将InputStream转为String
     * @param is
     * @return
     * @throws IOException
     */
    public static String inputStreamToString(InputStream is) throws IOException {
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        int i = -1;
        while ((i = is.read()) != -1) {
            out.write(i);
        }
        return out.toString();
    }
}
